<?php

namespace App\Rpc;

use App\Core\Model;
use App\Model\ClassModel;
use App\Model\ClassStudentModel;
use App\Model\CourseCatalogueModel;
use App\Model\CourseModel;

/**
 * 存储中心
 * @author lihaiping
 */
class StorageRpc
{
    /**
     * 将就文件修改为新文件
     * @param String $modelClass
     * @param array $param
     * @return bool
     */
    public function updateFilePath(string $modelClass, int $modelId, array $params): bool
    {
        $filesUrl = trim(config('storage_base_url'), '/') . '/';
        $selectColumns = array_keys($params);
        $selectColumns[] = $modelClass::UPDATED_AT;

        /**
         * @var Model $modelClass
         */
        $model = $modelClass::getInfoById($modelId, $selectColumns);
        if (!$model) {
            return true;
        }

        $attributes = $model->getAttributes();
        $updateData = [];
	    foreach ($params as $column => $files) {
		    if (empty($attributes[$column])) {
			    continue;
		    }

		    $isEditor = $modelClass::COLUMN[$column]['is_editor'] ?? false;
		    $hasUpdate = false;
		    if (!$isEditor) {
			    foreach ($files as $old => $file) {
				    $old = trim($old, '/');
				    if (strpos($attributes[$column], $old) !== false) {
					    $updateData[$column] = str_replace($old, $file, $attributes[$column]);
					    $hasUpdate = true;
					    continue;
				    }

				    $old = str_replace('/', '\\/', $old);
				    if (strpos($attributes[$column], $old) !== false || strpos($attributes[$column], urldecode($old)) !== false) {
					    $updateData[$column] = str_replace(urldecode($old), str_replace('/', '\\/', $file), $attributes[$column]);
					    $updateData[$column] = str_replace($old, str_replace('/', '\\/', $file), $attributes[$column]);
					    $hasUpdate = true;
				    }
			    }

			    if (!$hasUpdate) {
				    unset($updateData[$column]);
			    }
		    } else {
			    foreach ($files as $old => $file) {
				    $old = trim($old, '/');
				    $hasUpdate = false;
				    if (strpos($attributes[$column], $old) !== false || strpos($attributes[$column], urldecode($old)) !== false) {
					    $updateData[$column] = str_replace(urldecode($old), trim($file, '/'), $attributes[$column]);
					    $updateData[$column] = str_replace($old, trim($file, '/'), $attributes[$column]);
					    $hasUpdate = true;
				    }
			    }

			    if (!$hasUpdate) {
				    unset($updateData[$column]);
			    }
		    }
	    }

        if ($updateData) {
            if ( ! $modelClass::updateByParams([
                'id' => $modelId,
                $modelClass::UPDATED_AT => $attributes[$modelClass::UPDATED_AT] //时间作为条件避免数据交叉修改
            ], $updateData)) {
                responseError('需要重试');
            }
        }

        return true;
    }

    /**
     * 保存转码文件
     * @param int $status
     * @param string $modelClass
     * @param int $modelId
     * @param string $saveColumn
     * @return bool
     */
    public function saveTranscodeFile(string $modelClass, int $modelId, array $saveColumn): bool
    {
        /*
         * 这里处理规则是数据库字段必须要包含字段
         * file：原始文件(数组)
         * status：状态字段 0：未处理 1：已处理  2：处理失败
         * preview_file：处理结果的字段保存（数组）
         * update_at：数据最后一次修改的时间，避免数据错乱
         * time：播放时间建（单位：秒），如果是文件则没有改字段
         *-----------------------------------------------------------------------------------------------------------
         *-----------------------------------------------------------------------------------------------------------
         */
        $statusColumn = 'status';
        $previewFileColumn = 'preview_file';
        $fileColumn = 'file';
        $timeColumn = 'time';
        $updatAtColumn = $modelClass::UPDATED_AT;
        $transcodeColumn = $modelClass::C_TRANSCODE;
        $fileType = $saveColumn['fileType'] ?? '';

        /**
         * @var Model $modelClass
         */
        $model = $modelClass::getInfoById($modelId, [$fileColumn, $statusColumn, $previewFileColumn, $updatAtColumn, $transcodeColumn]);
        if (!$model) {
            return true;
        }

        $hasUpdate = false;
        $updateData = [$previewFileColumn => [], $statusColumn => $saveColumn[$statusColumn]];
        foreach ($saveColumn[$previewFileColumn] as $old => $file) {
            if ((is_array($model->transcode) && in_array(md5($old), $model->transcode)) || ( ! is_array($model->transcode) && md5($old) == $model->transcode)) {
                $updateData[$previewFileColumn][] = $file;
                if (isset($saveColumn[$timeColumn]) && isset($saveColumn[$timeColumn][$old])) {
                    $updateData[$timeColumn] = floor($saveColumn[$timeColumn][$old] / 60);
                }
                $hasUpdate = true;
            }
        }

        if ($hasUpdate) {
            foreach ($updateData as $column => $value) {
                if (is_array($value)) {
                    $updateData[$column] = json_encode($value);
                }
            }
            $query = $modelClass::updateByParams([
                    'id' => $modelId,
                    $modelClass::UPDATED_AT => $model->getOriginal($modelClass::UPDATED_AT)
                ],
                $updateData
            );
            if ( ! $query) {
                responseError('需要重试');
            }

            // 更新课程时长
            if ($modelClass === CourseCatalogueModel::class) {
                $info = CourseCatalogueModel::getInfoById($modelId);
                if ($info) {
                    CourseModel::updateByParams(['id' => $info->courseId], [
                        CourseModel::C_CLASS_HOUR => CourseCatalogueModel::getTotalTimes($info->companyId, $info->courseId)
                    ]);
                }
                unset($info);
            }
        }

        return true;
    }

    /**
     * 保存已经生成好的证书
     * @param int $status
     * @param string $modelClass
     * @param int $modelId
     * @param string $saveColumn
     * @return bool
     */
    public function saveCredentials(string $modelClass, int $modelId, array $saveColumn): bool
    {
        /**
         * @var Model $modelClass
         */
        $model = $modelClass::getInfoById($modelId);
        if (!$model) {
            return true;
        }

        $time = $saveColumn['time'];
        //超时后停止错误
        if (time() - $time > 3600 * 2) {
            responseError('处理超时，不作处理', 502);
        }

        if ($modelClass === ClassStudentModel::class) {
            $model->credentials = $saveColumn['credential'];
            $class = ClassModel::getInfoById($model->classId);
	        //判断班级是否存在   班级被删除之后 直接返回
	        if(!$class){
		        return true;
	        }
            //未处于结班状态不处理
            if ($class->status != 40) {
                responseError('继续等待，班级未处于结班状态');
            }

            if ($model->save()) {
                return true;
            }
            responseError('保存失败');
        }

        return true;
    }
}
